#include "consolegui.h"

console_gui_menu_t *console_gui_create_menu()
{
	console_gui_menu_t *lp;

	lp = (console_gui_menu_t *) malloc(sizeof(console_gui_menu_t));
	if(lp == NULL) {
		return NULL;
	}

	memset(lp, 0, sizeof(console_gui_menu_t));

	return lp;
}

console_gui_t * console_gui_create(size_t buff_size)
{
	console_gui_t *lp;

	lp = (console_gui_t *) malloc(sizeof(console_gui_t));
	if(lp == NULL) {
		return NULL;
	}
	
	if(buff_size == 0) {
		buff_size = (size_t) 128;
	}

	lp->buff = (char *) malloc(buff_size);
	if(lp->buff == NULL) {
		free(lp);
		return NULL;
	}

	memset(lp, 0, sizeof(console_gui_t));

	return lp;
}

void console_gui_add_menu_element(
		console_gui_menu_t *cgui_menu, ///< dependent menu
		int event_id, ///< event id
		char *subject, ///< element subject (label)
		console_gui_element_type_t element_type, ///< input type
		void *item, ///< item : 'input qeury' or menu. menu is only element_type CGUI_ELEMENT_TYPE_MENU
		void *ex_param, ///< NULL 이 아닐 경우 callback 프로시저에서 external_parameter 를 전달 한다. console_gui_t 에 정의된 프로시저가 호출 될 경우 external parameter2 로 전달 된다.
		int (*callback_procedure) (console_gui_event_t *event, 
									void *ex_param1, 
									void *ex_param2, 
									void *parameter)) ///< NULL 이 아닐 경우 console_gui_t 에 정의된 프로시저가 아닌 이 callback 프로시저가 호출 된다.
{
}

int console_gui_play(console_gui_t *gui)
{
	int flag_save;

	setenv("ESCDELAY", "0", 1); // remove delay for a key 'ESC'
	initscr();
	raw();
	keypad(stdscr, TRUE);

	flag_save = 0;
	
	noecho();
	endwin();
	return flag_save;
}

// TEST CODE
int callback_procedure(console_gui_event_t *event, void *external_param, void *parameter)
{
	if(event->event_type == CGUI_ELEMENT_EVENT_TYPE_BEGIN)  {
		return 0;
	}
	switch(event->event_id) 
	{
		case 1:
			break;
		case 2:
			break;
		case 3:
			break;
		case 4:
			break;
		case 5:
			break;
	}

	return 0;
}

// TEST
int main()
{
	console_gui_t *cgui;
	console_gui_menu_t *cgui_menu;

	cgui = console_gui_create();
	if(cgui == NULL) {
		return 0;
	}

	cgui_menu = console_gui_create_menu();
	if(cgui_menu == NULL) {
		return 0;
	}
	console_gui_add_menu_element(cgui_menu, 1, "Main Subject 1", CGUI_ELEMENT_TYPE_CHARACTER, "", NULL, NULL);

	cgui->menu = cgui_menu;
	cgui->callback_procedure = callback_procedure;

	console_gui_play(cgui);

	return 0;
}
